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

问题描述 投票:0回答:1

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

ubuntu compilation linker g++ quickfix
1个回答
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

现在,我们可以通过链接相应的库来编译我们的main函数:

$ g++ main.cpp -L. -ly -lx

要执行程序,首先我们需要为编译器设置LD_LIBRARY_PATH以查找新创建的“共享库”:

$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:.
$ ./a.out

我们可以立即检查结果:

$ echo $? 
4

如果我们在U​​buntu 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文章的阅读建议撰写了这篇文章。

© www.soinside.com 2019 - 2024. All rights reserved.