我尝试将使用Visual C++编译的静态库链接到使用GCC编译的程序,并调用someFunction()
在github上有库和程序的源代码
https://github.com/Kaspek2480/DoubleCompilersProblem
[1/2] Building CXX object CMakeFiles/myprogram.dir/main.cpp.obj
[2/2] Linking CXX executable myprogram.exe
FAILED: myprogram.exe
cmd.exe /C "cd . && C:\dev-tools\mingw64\bin\c++.exe -O3 -DNDEBUG CMakeFiles/myprogram.dir/main.cpp.obj -o myprogram.exe -Wl,--out-implib,libmyprogram.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -LC:/Users/Kaspek/CLionProjects/LinkerTest/VisualCppStaticLibrary/cmake-build-release-visual-studio -lmylibrary -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
c:/dev-tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/myprogram.dir/main.cpp.obj:main.cpp:(.text.startup+0xe): undefined reference to `someFunction()'```
垃圾箱:
Dump of file C:\Users\Kaspek\CLionProjects\LinkerTest\VisualCppStaticLibrary\cmake-build-release-visual-studio\mylibrary.lib
File Type: LIBRARY
Linker Directives
-----------------
/DEFAULTLIB:MSVCRT
/DEFAULTLIB:OLDNAMES
/EXPORT:someFunction
Summary
60 .chks64
DC .debug$S
44 .drectve
18 .pdata
1C .rdata
BA .text$mn
20 .xdata
使用visual c++编译的库是用C写的,所以函数名不会被破坏。我的代码有什么问题?
1条答案
按热度按时间mu0hgdu01#
我可以使用gcc链接一个用微软
cl
命令行编译器编译的普通目标文件和一个用gcc编译的主文件,这两个文件都是C文件(提示cl
将其视为C文件);我认为名称修饰方案阻止了来自不同源代码的C++派生对象文件的链接,除非将接口限制为C子集并声明那些函数extern "C"
。在这两种情况下我都使用了各自的64位编译器。64位
cl
没有在函数名前面加上下划线(32位版本有)。gcc也没有。当使用IDE进行编译时,传递给编译器的大约27个选项中的某些选项会导致
cl
调用生成对运行时库和调试库的调用;当从命令行用简单的/c调用时,它不会。当链接时,ld
警告“def文件末尾的.drectve已损坏”;但是程序运行并产生一个退出值:使用32位Microsoft编译器时,函数符号的名称为
_f
:在这种情况下,
main.c
中f()
的声明必须更改为_f()
,以便链接器可以找到该函数(我认为gcc工具链也需要是32位的)。