顯示具有 VisualStudio 標籤的文章。 顯示所有文章
顯示具有 VisualStudio 標籤的文章。 顯示所有文章

2018年3月9日 星期五

Visual Studio IMAGE::BuildImage 錯誤

Visual Studio IMAGE::BuildImage

錯誤信息:
LINK : fatal error LNK1000: Internal error during 
IMAGE::BuildImage
先按上面的清除方案把暫存檔清掉,如果沒犯什麼引入的錯大概就好了
如果清掉還是不行,有可能是引入的問題
  1. A.cpp 引入 B.hpp 然後 B.cpp 又引入 A.hpp 互相卡住
  2. 盡量清除 .hpp 內的引入,寫到 .cpp 內
[1] 整理一下邏輯了,會互卡就很奇怪了~很容易出現在架構沒出來走一步算一步的情況
[2] 降低多餘的引用,如果寫在 hpp 內每個引用的檔案都會引用到
寫道 cpp 內的話需要置後,比如說一份檔案 A.hpp 內寫到了 vector ,那你在 A.cpp 的時候要這樣寫
#include <vector>
#include "A.hpp"
這樣就能編過了,不過也導致每個引入 A 的都要補 vector,如果是內建的比如說 vector、string 這些用到的機率也很高就寫吧;如果是自己寫的函式庫看有沒有方法,改個寫法避開,原則上能越少越好。

參考

2018年3月8日 星期四

Visutal studio 中的 git 同步失敗 Git failed with a fatal error

Visutal studio 中的 git 同步失敗

出現的訊息是這樣的:
在存放庫 C:\Users\hunan\source\repos\feat_fast 中於本機建立了認可 89194807
推送至遠端存放庫時發生錯誤: Git failed with a fatal error.
HttpRequestException encountered.
   �ǰe�n�D�ɵo�Ϳ��~�C
cannot spawn askpass: No such file or directory
could not read Username for 'https://github.com': terminal prompts disabled
Pushing to https://github.com/XXXX/ORB.git
我最後的解決辦法是開啟 git for windwos 中的 bash 然後 cd 到目錄位置,使用他來上傳
git push master origin
更新今天找到原因了,因為github改版了,在認證上有做調整
https://githubengineering.com/crypto-removal-notice/
VS是被引響到的範圍之一,更新VS到最新版本就好了,然後建議 git for windows 也更新一下到最新版。

參考

2018年2月6日 星期二

visual studio 插入片段代碼 快速打出重複文字

visual studio 插入片段代碼 快速打出重複文字

用過 sublimetext 一直很喜歡他的插入片段 snippet,後來需要開發比較大的專案 sublimetext 就顯得有點功能不足了,改用了VS,一開始很不習慣缺了很多片段插入,後來才發現其實VS也可以自訂

安裝套件


先到這裡來打開更新管理員

再來搜尋 snippet desingner 安裝他

使用

使用上很簡單,不過一開始可能會搞不清楚狀況

直接對著你需要插入的代碼框起來按右鍵,就可以新增了,儲存的時候不要改位置直接存檔。

這個是已經做好的片段,可以看一下這邊意思
$void$ $function_name$($int$ $var$){
    $end$
    $return$;
}

上方

A:snippet→ 你在片段管理員會看到的名稱可以詳細打全名,但是也不要太長
B:shortcut→ 你在打程式中呼叫的代號
這邊的定義就是在代碼中打B會看到一個片段是B,B的詳細說明是A

中間片段

中間手動打之後會自動跑到下面,大致上來說就兩個用法
$str$ 直接打你要的字符,str是預設出現的東西會框起來給你改
打出第二個以上會要讓你用 tab 選擇。
使用時會一直在亮起來的地方輪流
$end$ 結束的時候要在哪裡,結束的意思是指按enter,如果一直按 tab 就是前面的代碼一直輪流跑,直到在任一次循環按下enter直接跳到結尾。(預設的for迴圈也是這樣的可以玩玩看功能)
當你按下 enter 之後就跑來這裡
這裡還有一個用法是 $selected$ 不過我也用不出來是要幹嘛,參考內建的用法他好像通常都出現在 $end$ 之前,但是實測就算拿掉 $selected$ 功能也不會有影響。

其他

在一個選項 kind(種類) 中有一個 object 與 literal 可選,我有去查一下好像是插 object 可以從外部輸入,但是具體我也不曉得怎麼用。
在不從外部插入的情況下,使用上兩者沒有任何區別;沒特別需求的人可以當作一樣的好。

其他方便的片段

快速打出 cout
cout << "$string$=" << $var$ << endl;
$selected$ $end$
初始化main函式
#include <iostream>
using namespace std;

//====================================================================================
int main(int argc, char const *argv[]){
    $end$
    return 0;
}
//====================================================================================

2018年1月30日 星期二

C++ boost lib 如何安裝在 Visual Stusio 2017 15.5 版

C++ boost lib 如何安裝在 Visual Stusio 2017 15.5 版

下載

先下載這些下來
boost官方載點:Boost Downloads

編譯

批次檔要整個github都下載下來,再來把 boost_1_66_0.zip 解開直接丟進去批次檔裡面,然後執行批次檔 build_boost_1_66_vs2017.5,要跑一段時間就編譯完成了。

使用

解之後開進去 boost1_66_0 會多一個 stage 裡面就是編譯好的 lib 檔案,就可以直接拿來用了。
include的目錄就是那一整個 boost 裡面都是很雜很多。
這一篇是設定別的函式庫,就是把 lib 跟 include 的目錄改掉而已,而bin目錄不需要設置。

測試代碼

#include <iostream>
using namespace std;

#include <boost/thread/thread.hpp>
#include <boost/bind.hpp> 
using namespace boost;

#include <boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;

void helloworld() {
    cout << "Hello World!" << endl;
}

int main(int argc, char const *argv[]) {
    thread thrd(&helloworld);
    thrd.join();

    uint1024_t bigNum = -1;
    cout << bigNum << endl;
    return 0;
}

參考

2018年1月21日 星期日

C++ 如何引入已經寫好的 C 函式庫

C++ 如何引入已經寫好的 C 函式庫

只要告訴編譯器這一段是C語言就可以了,編譯器自己的會處理好,宣告方式如下
extern  "C"
需要把這一行加在函式的定義與宣告上,也就是 .c 與 .h 都要加上,可以使用括號涵蓋一個範圍
extern  "C" {
// Your code
}
如果這個函式庫是你正在開發的,還需需要被C的編譯器編譯就補上宏定義,讓代碼可以同時讓C與C++編譯器編譯
#ifdef  __cplusplus
extern  "C" {
#endif

// Your code

#ifdef  __cplusplus
}
#endif

範例

下面在C++檔案內引入C的檔案
// fileName : fun.h
#pragma once

#ifdef  __cplusplus
extern  "C" {
#endif

void fun();

#ifdef  __cplusplus
}
#endif
// fileName : fun.c
#ifdef  __cplusplus
extern  "C" {
#endif

#include <stdlib.h>
#include <stdio.h>    
void fun() {
    printf("c file \n");
}

#ifdef  __cplusplus
}
#endif
// fileName : main.cpp
#include <iostream>
#include "fun.h"

int main(int argc, char const *argv[]){
    fun();
    return 0;
}

原因

C++ 多了重載的功能,對於函式名稱的解析規則與C不一樣
對於C來說
fun(int, int); 與 fun(char, char); 都是解析成同一個 _foo
對C++來說則是解析成
fun(int, int); -> _fun_int_int
fun(char, char); -> _fun_char_char
這也正是可以多載的原因,如果加了修飾子則可以使用C的規則解析。
比如說上面的範例的C檔案沒有加入 extern “C” ,C++檔案直接引入 .h,這時候 fun.h 裡面的宣告是複製貼到 main.cpp 上,解析是看檔名,該份檔案是.cpp會被解析成 _fun_int_int ,則 fun.c 編譯的時候則被解析成 _fun 這時候名字就對不上了。

參考

2018年1月15日 星期一

Visual Studio 編譯出 lib 檔案並使用

Visual Studio 編譯出 lib 檔案並使用

一般有分靜態函式檔案lib與動態函式檔案dll,簡單的區別方式就是使用的時機不一樣。
如果你今天是在寫程式,想要引入一個已經寫好的函式那麼需要的是lib,靜態指的就是編譯器在編譯的時候就把它納入了不能在做什麼更改了。
動態的則是編譯的時候並不需要它,而是等到程式編譯好之後在執行期可以動態載入或是取消,這樣的方式使用。
編寫lib主要好處有2個,第一個是不用重新編譯,如果程式碼很多的話每一次就重新編一全部都很耗費時間,先編好的這一個部分就不用再動它了,不過現代的編譯器都會自動做這個優化當你這一份檔案.cpp完全沒動編譯器就不管直接取上一次編譯的結果。
第二個則是隱藏的你的代馬,如果你寫了一個大程式其中有一部分核心代碼不想公開,或是整份都不想,這時候編譯成lib檔案,對方就沒辦法輕易獲得妳的代碼。
下面是用VisualStudio實作的範例

Visual Studio 編譯出 lib

先新建一個方案或專案
選擇lib,然後底下的 先行編譯標頭檔(P) 要取消打勾
這樣可以建立空白專案(圖中截圖沒拍好)
然後新建這兩份檔案,檔案來源是微軟的教程
標頭檔
#pragma once

// MathFuncsLib.h

namespace MathFuncs
{
    class MyMathFuncs
    {
    public:
        // Returns a + b
        static double Add(double a, double b);

        // Returns a - b
        static double Subtract(double a, double b);

        // Returns a * b
        static double Multiply(double a, double b);

        // Returns a / b
        static double Divide(double a, double b);
    };
}
定義檔
// MathFuncsLib.cpp
// compile with: cl /c /EHsc MathFuncsLib.cpp
// post-build command: lib MathFuncsLib.obj

#include "MathFuncsLib.h"

#include <stdexcept>
#include <iostream>
using namespace std;

namespace MathFuncs
{
    double MyMathFuncs::Add(double a, double b)
    {
        return a + b;
    }

    double MyMathFuncs::Subtract(double a, double b)
    {
        return a - b;
    }

    double MyMathFuncs::Multiply(double a, double b)
    {
        return a * b;
    }

    double MyMathFuncs::Divide(double a, double b)
    {
        return a / b;
    }
}
新增完畢之後並不是按F5編譯,而是建置方案
這一步驟執行完畢就會有lib檔案了,到專案資料夾去看
取出這個檔案 .lib 與 .h 就可以直接用了

測試檔案

我們可以在同一個方案裡面新增多個專方案,可以透過左邊看哪一個是粗體就是目前處理的方案,不過這個不是很明顯不好分辨就是了。
跟剛剛一樣選擇 傳統方案,然後這次選擇exe而不是lib,並且勾選空白專案。建立出一個新專案。
把新專案設置成主要
然後新增下面代碼(這裡一定要先新增一個cpp選項才會有東西)
// MyExecRefsLib.cpp
// compile with: cl /EHsc MyExecRefsLib.cpp /link MathFuncsLib.lib

#include <iostream>

#include "MathFuncsLib.h"

using namespace std;

int main()
{
    double a = 7.4;
    int b = 99;

    cout << "a + b = " <<
        MathFuncs::MyMathFuncs::Add(a, b) << endl;
    cout << "a - b = " <<
        MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
    cout << "a * b = " <<
        MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
    cout << "a / b = " <<
        MathFuncs::MyMathFuncs::Divide(a, b) << endl;

    return 0;
}
到屬性內
新增剛剛那個專案的那個.h檔的目錄
新增lib位置
新增 lib 檔名
然後就編譯吧~就可以使用了
如果你要更改lib的內容就直接更改然後做這個動作重編即可,因為是直接引用邊出來的檔案,所以編譯之後就直接更改目標檔案了,這樣比較方便也不用開兩個vs視窗。
最後是這一次教程的文件,我把它上傳到github上了,可以自行下載測試。
https://github.com/hunandy14/libCreate

VisutalStudio 想要傳給別人或封存,如何瘦身只保留必要檔案

VisutalStudio 想要傳給別人或封存,如何瘦身只保留必要檔案

最簡單的辦法直接在程式新建git倉庫,然後上傳到github,然後把網址貼給對方
如果是需要打包成rar且不方便公開在網路上那就不要上傳,本地新建git就好,然後只保留資料夾內的隱藏git資料夾,其他全部砍掉,再用git還原到最新分支就是過濾後的檔案了0。
哪些檔案可以忽略刪除,可以參考這一份檔案,檔案清單內的都是可以刪除的。也可以依據這份清單自己寫一份批次檔自動刪除檔案。
下面說明一下怎麼使用

打包上傳至github

找到專案右下角新建倉庫,初始化git
選擇上傳至github
登入帳號並發行;
如果不要公開到這邊就不要推送,本地倉庫已經建好了。
再來就有網址給你點,可以連到自己的guthub
右邊載下來就是一個瘦身過後的rar檔案


不上傳怎麼還原

上面方法是比較簡單,按幾下就好了還幫你上傳到網路上給別人網址就好,如果不想公開可以參考下面作法。
先打開所在資料夾
建議先整份copy到桌面或其他位置,然後只保留git這個資料夾剩下刪除
然後按住sift在按滑鼠右鍵(路徑不一樣是我複製一份到桌面)
輸入命令回到最新狀態
git reset --hard
在來就打包這個文件吧,不想要公開編輯紀錄就把 .git 這個文件夾砍了
git命令安裝從這裡下載:http://gitforwindows.org/
無腦下一步到底就可以了,中間有一個問你要不要新增右鍵選單我個人會把它勾掉,覺得電腦會變醜XDD;如果安裝之後覺得醜想刪除,不用擔心,移除重新安裝就可以了。
詳細使用方法可以參考站內文章:https://charlottehong.blogspot.tw/2017/01/git.html
這邊會有分設定 VisutalStudio 跟 git for windows是兩個不同的軟體,所以要個別設定,但是兩個都是用一套git軟體,可能會產生錯覺,我不是設定過了之類的。