2016-10-21 15 views
0

Linuxのウィンドウ用にC++プログラムをコンパイルしようとしています。このプログラムは、SHGetKnownFolderPath関数を使用します。私はこれをコンパイルしようとするたびに、私は次のエラーを取得する:C++ LinuxからWindowsへクロスコンパイルエラー

$ x86_64-w64-mingw32-g++ main.cpp main.h -mwindows -o main.exe 
/tmp/cc7yIaVK.o:main.cpp:(.text+0x11c): undefined reference to `SHGetKnownFolderPath' 
/tmp/cc7yIaVK.o:main.cpp:(.rdata$.refptr.FOLDERID_Startup[.refptr.FOLDERID_Startup]+0x0): undefined reference to `FOLDERID_Startup' 
collect2: error: ld returned 1 exit status 

ここで私が書いたコードです:

int WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd){ 
    //get startup folder 
    if(SHGetKnownFolderPath(FOLDERID_Startup, 0, NULL, &startupFolder) != S_OK){ 
     //error in getting startup folder 
     return -1; 
    } 
    /* 
    ... 
    */ 
} 

私は、適切なヘッダファイルを含まれており、Windowsのバージョンに定義:

は、
#define WINVER 0x0600 
#define _WIN32_WINNT 0x0600 
#include <shlobj.h> 

EDIT:mingw.orgのドキュメントによれば、コンパイル時にlibファイルをリンクする必要があることがわかりました。おそらく、ソースファイル名の後ろに-lフラグが付いています。私は必要なファイルの名前が何であるかはわかりません。

私は他に何をすべきかわかりません。

ありがとうございました。 (Windowsバイナリを認識し、適切なナノメートルで)

+0

'#のinclude'sと'#のdefine'sは、コンパイル時間のためにだけに興味深いです:

は、私は少しテストプログラムを作りました。コンパイルエラーはなくリンカーエラーです。リンカーに必要なものを提供するためには、あなたが自分のものと一緒にリンクしなければならないものを見つけ出す必要があります。 https://github.com/HandBrake/HandBrake/issues/112は役に立ちますか? – Alfe

+0

@Alfe Googleのリンクも見ましたが、うまくいきません。明らかに、これらのサイトには現在DDoS攻撃があります:http://www.pcworld.com/article/3133847/internet/ddos-attack-on-dyn-knocks-spotify-twitter-githubetsets-and-more- offline.html – Yapoz

+0

QT/MinGW 4.8で[SHChangeNotifyRegister]の可能な複製がリンクできません](http://stackoverflow.com/questions/18048068/shchangenotifyregister-with-qt-mingw-4-8-cannot-link) – krOoze

答えて

0

クイック検索/ nmの0は与える:

[email protected]:~/ellcc-release/libecc/mingw/x86_64-w64-mingw32$ find . -name "*.a" | xargs ~/ellcc/bin/ecc-nm -A | grep FOLDERID_Startup 
/home/rich/ellcc/bin/ecc-nm: ./sys-root/mingw/lib/libruntimeobject.a: File format not recognized 
./sys-root/mingw/lib/libuuid.a:lib64_libuuid_a-uuid.o:0000000000000000 r .rdata$FOLDERID_Startup 
./sys-root/mingw/lib/libuuid.a:lib64_libuuid_a-uuid.o:0000000000000000 R FOLDERID_Startup 
[email protected]:~/ellcc-release/libecc/mingw/x86_64-w64-mingw32$ 

何が必要-luuidであるかのように見えます。

[email protected]:~$ cat win.c 
#define WINVER 0x0600 
#define _WIN32_WINNT 0x0600 
#include <shlobj.h> 
int WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd){ 
    const char *startupFolder; 
    //get startup folder 
    if(SHGetKnownFolderPath(&FOLDERID_Startup, 0, NULL, &startupFolder) != S_OK){ 
     //error in getting startup folder 
     return -1; 
    } 
    /* 
    ... 
    */ 
} 

[email protected]:~$ ~/ellcc/bin/ecc -target x86_64-w64-mingw32 win.c -luuid 
win.c:7:57: warning: incompatible pointer types passing 'const char **' to 
     parameter of type 'PWSTR *' (aka 'unsigned short **') 
     [-Wincompatible-pointer-types] 
    if(SHGetKnownFolderPath(&FOLDERID_Startup, 0, NULL, &startupFolder) != S... 
                 ^~~~~~~~~~~~~~ 
/home/rich/ellcc/bin/../libecc/mingw/include/shlobj.h:746:92: note: passing 
     argument to parameter 'ppszPath' here 
    ...(REFKNOWNFOLDERID rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath); 
                   ^
1 warning generated. 
[email protected]:~$ 
+0

こんにちは、あなたの答えに感謝します。 -luuidはFOLDERID_Startupの問題を修正するようですが、私のエラーでは 'SHGetKnownFolderPath'への未定義の参照を取得します。私はこれが同じ解決策で修正されると思ったでしょう。 main.cppに行を付けるのではなく、 '/tmp/cc5KqFce.o:main.cpp :(。text + 0x150)'と書いてあるので、これは別のリンカーエラーだと思います。 – Yapoz

+0

そのシンボルはlibshel​​l32.aで定義されています。私のclang/mingwにはデフォルトで、それが含まれています。 -lshell32を追加すると修正されます。 –

+0

nope、同じエラー。 -lshell32は何もしないようですが、-luuidは2つのエラーのうち1つを削除します。 – Yapoz

関連する問題