我正在尝试在Ubuntu上编译一个quickfix程序,但是我得到了对1
的未定义引用,好像FIX::
选项没有放在g ++命令中。实际上,如果没有此链接选项,我会得到相同的结果。
首先,我已经下载,编译并运行了quickfix的测试。一切都很好。我执行了-lquickfix
并检查了库在运行sudo make install
后缓存了:
sudo ldconfig
这是我使用的g ++命令:
$ 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
顺便说一下,我在Debian上运行了相同的quickfix安装步骤,编译命令工作正常。
我阅读了Libraries in /usr/local/lib not found这样的帖子,使用了$ g++ -fexceptions -finline-functions -lquickfix -lpthread -lxml2 -std=c++11 Application.cpp tradeclient.cpp -o tradeclient
选项用于链接目录,-L
用于包含路径,但我仍然没有找到解决方案。
答案 0 :(得分:0)
此示例显示使用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
现在,我们可以通过链接相应的库来编译我们的主要功能:
$ 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文章的阅读建议写了这篇文章。