我正在尝试在Ubuntu上编译一个quickfix程序,但我得到了对FIX::
的未定义引用,好像-lquickfix
选项没有放在g ++命令中。实际上,如果没有此链接选项,我会得到相同的结果。
首先,我已经下载,编译并运行了quickfix的测试。一切都很好。我做了sudo make install
并检查了库在运行sudo ldconfig
后被缓存:
$ ldconfig -p | grep quickfix
libquickfix.so.16 (libc6,x86-64) => /usr/local/lib/libquickfix.so.16
libquickfix.so (libc6,x86-64) => /usr/local/lib/libquickfix.so
这是我使用的g ++命令:
$ g++ -fexceptions -finline-functions -lquickfix -lpthread -lxml2 -std=c++11 Application.cpp tradeclient.cpp -o tradeclient
顺便说一下,我在Debian上运行了相同的quickfix安装步骤,编译命令运行正常。
我读过像Libraries in /usr/local/lib not found这样的帖子,使用-L
选项获取链接目录,使用-I
获取包含路径,但我仍然没有找到解决方案。
此示例显示使用g ++的链接参数顺序可能或可能不重要,具体取决于您使用的操作系统。
main.cpp中:
extern int x_global;
int y_func(int a);
int main(int argc, char *argv[]) {
int x = x_global + 1;
return y_func(x);
}
x.cpp:
int x_global = 2;
y.cpp的:
int y_func(int a) {
return a + 1;
}
鉴于这三个文件,我们可以创建main.cpp
所依赖的“共享库”:
$ g++ -shared x.cpp -o libx.so
$ g++ -shared y.cpp -o liby.so
现在,我们可以通过链接相应的库来编译我们的main函数:
$ g++ main.cpp -L. -ly -lx
要执行程序,首先我们需要为编译器设置LD_LIBRARY_PATH以查找新创建的“共享库”:
$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:.
$ ./a.out
我们可以立即检查结果:
$ echo $?
4
如果我们在Ubuntu 16或17上,则编译命令取决于其参数的顺序。例如,这将无法正确链接,从而产生未定义的引用:
$ g++ -L. -ly main.cpp -lx
/tmp/ccYWLawS.o: In function `main':
main.cpp:(.text+0x21): undefined reference to `y_func(int)'
collect2: error: ld returned 1 exit status
看看这不会链接:
$ g++ -L. -ly -lx main.cpp
/tmp/ccEYEAtM.o: In function `main':
main.cpp:(.text+0x11): undefined reference to `x_global'
main.cpp:(.text+0x21): undefined reference to `y_func(int)'
collect2: error: ld returned 1 exit status
但如果您使用的是Debian 7,8或9,这两个前面提到的示例将编译没有问题。我们在这里使用共享(或动态)库(* .so)的帐户。当我们使用静态库(* .a)时,顺序对两个操作系统都很重要。
我根据Mike Kinghan和Beginner's Guide to Linkers文章的阅读建议撰写了这篇文章。