使用g ++链接到外部库

时间:2017-11-21 10:23:04

标签: c++ c gcc g++

我下载了FMUSDK,我想编译代码。不幸的是,构建脚本应该与Visual Studio C编译器一起使用,但我无法在我的机器上安装/使用它。因此,我尝试修改脚本(以及代码的某些部分)以便能够使用GCC编译它。但我对编译复杂代码完全不熟悉(我通常只使用gcc * .c -o outfile.exe)

这是我的问题: 在某些文件中有一个与

链接的库
 #pragma comment(lib, "libxml2.lib")

这不适用于GCC。

可以在..\shared\parser\libxml2.lib找到lib 包含..\shared\parser\libxml\

中的标题文件

我用

调用构建脚本
fmusdk\fmu20\src\co_simulation>..\build_fmusim_cs_gcc.bat

然后脚本如下所示:

set SRC=main.c ..\shared\sim_support.c ..\shared\xmlVersionParser.c ..\shared\parser\XmlParser.cpp ..\shared\parser\XmlElement.cpp ..\shared\parser\XmlParserCApi.cpp
set INC=-I ..\shared\include -I ..\shared -I ..\shared\parser\libxml -I ..\shared\parser 
set LIB=-L ..\shared\include -L ..\shared -L ..\shared\parser\libxml -L ..\shared\parser 
set OPTIONS=-D FMI_COSIMULATION -D STANDALONE_XML_PARSER -D LIBXML_STATIC -v

g++ %INC% %OPTIONS% %SRC% %LIB% -lxml2 -o fmu20sim_cs.exe 

但是我收到以下错误消息:

c:/users/<username>/userprograms/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot find -lxml2

我尝试使用我在http://www.rapidtables.com/code/linux/gcc/gcc-l.htm上找到的内容,但我似乎没有工作。

有人可以帮忙吗?我究竟做错了什么?在INC和LIB下,我把所有看起来都很有帮助的东西,但我不知道我在那里做了什么......

我还有一个日志文件,其中包含批处理文件的详细输出。但我不知道如何上传它:(

祝你好运, 马丁

2 个答案:

答案 0 :(得分:2)

您应该-lxml2替换-llibxml2

解释,来自Mingw

  

另请注意,库名"lib<name>.a""lib<name>.lib"不相同;如果您有一个根据异常"lib<name>.lib"约定命名的库,"-l<name>"规范将无法找到它 - 如果您无法重命名该库,则必须使用"-llib<name>"形式代替

答案 1 :(得分:2)

libxml2.lib是(经常)弄乱库名称约定的例子。 Visual Studio使用添加.lib扩展名的约定(这将是xml2.lib),GCC使用向库名添加lib前缀和.a扩展名的约定(这将是libxml2.a)。

根据GCC手册(https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/Link-Options.html#Link-Options),您有两种选择:

  1. 将库文件名更改为libxml2.a,因为这是GCC在给定-lxml2选项时要查找的文件名。
      

    链接器搜索库的标准目录列表,该列表实际上是名为lib library .a的文件。

  2. 提供库文件的全名,不包含-l(例如,在g ++命令行中将-lxml2更改为libxml2.lib),然后GCC将完全查找给定名称。
      

    不以特殊识别后缀结尾的文件名被视为命名对象文件或库。 (链接器根据文件内容将目标文件与库区分开来。)如果完成链接,这些目标文件将用作链接器的输入。