在最近使用新的 Ubuntu 安装(以前是 11.04,现在是 12.04)后,我的项目似乎无法正确链接。我尝试链接到开源渲染库 LuxRender 的 API。我的代码是用 C++ 编写并使用 g++ 编译的。
我已经在这个问题上花费了很多时间,并且遇到了一些类似症状的问题的解决方案。但是,我还没有找到解决方案,所以我来这里寻求帮助。
示例代码 testmain.cc:
#include <lux_api.h>
int main (int argc, char* argv[]) {
lux_instance* lux = CreateLuxInstance("Test");
DestroyLuxInstance(lux);
return 0;
}
问题
$ g++ -c -o testmain.o testmain.cc -Wall -g -pedantic -I/home/taz/lux/lux-build/lux/cpp_api -I/home/taz/lux/lux-build/lux/core -I/home/taz/lux/lux-build/lux/core/queryable
$ g++ -o testmain testmain.o -llux
testmain.o: In function `main':
/home/taz/Documents/msc/test/testmain.cc:4: undefined reference to `CreateLuxInstance'
/home/taz/Documents/msc/test/testmain.cc:5: undefined reference to `DestroyLuxInstance'
collect2: ld returned 1 exit status
首先,请注意,虽然其他人自 Ubuntu 11.10 以来存在链接问题,但链接顺序是正确的(-llux
after testmain.o
),所以这不是问题。
其次,CreateLuxInstance 和 DestroyLuxInstance 函数是使用lux_api.h中的 C 风格命名(with extern "C"
)导出的。我包含了发生这种情况的头文件,所以编译器应该知道它,对吗?(使用 . 检查预处理器输出。)函数确实正确出现在库中,因此它们应该可供链接器使用:g++ -E
$ nm -s /usr/local/lib/liblux.so | grep LuxInstance
000000000008c440 t CreateLuxInstance
000000000008c4d0 t DestroyLuxInstance
第三,我使用维护者的 cmake 文件从源代码编译(并在升级后重新编译)这个库。但即使我从他们的网站上获取编译版本,我也会遇到同样的问题。在这两种情况下,库都匹配包含的标头。
最后,我知道通过传递-Wl,--verbose
查看链接器实际使用的库文件来使用正确的库文件。
我在这里想念什么?
一些版本:
$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.22
Copyright 2011 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ uname -a
Linux linuxtaz 3.2.0-24-generic #37-Ubuntu SMP Wed Apr 25 08:43:22 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -irc
Distributor ID: Ubuntu
Release: 12.04
Codename: precise
编辑:
在构建 luxShared(与 Lux api 一起使用的共享库)时,问题出现在 de LuxRender 分发中。为什么在 Ubuntu 升级后出现这个问题对我来说仍然是一个谜,但对于其他正在努力解决这个问题的人来说,这是我的“解决方案”:
我想要构建的发行版是v1.0-RC1。在文件中cpp_api/export_defs.h
,我添加了以下几行:
#ifdef LUX_DLL
#define CPP_API __attribute__ ((visibility ("default")))
#endif
编译器抱怨 CPP_API 被双重声明,但我忽略了这一点。现在该库使用公开可用的 API 函数构建:
$ nm ./liblux.so | grep LuxInstance
000000000008c6c0 T CreateLuxInstance
000000000008c750 T DestroyLuxInstance