g ++链接或引用不与本地安装的库一起使用:未定义的引用

时间:2018-02-27 04:01:50

标签: ubuntu compilation linker g++ quickfix

我正在尝试在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用于包含路径,但我仍然没有找到解决方案。

1 个答案:

答案 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文章的阅读建议写了这篇文章。