0

在最近使用新的 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 以来存在链接问题,但链接顺序是正确的(-lluxafter 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
4

1 回答 1

2

这些函数确实正确出现在库中,因此它们应该可供链接器使用:

$ nm -s /usr/local/lib/liblux.so | grep LuxInstance
000000000008c440 t CreateLuxInstance
000000000008c4d0 t DestroyLuxInstance

不,他们没有t符号是本地的(不能在定义它们的库之外使用)。你想要T(全局)符号。

如果这些符号是由lux_api.h(它们似乎是)导出的,则该库尚未正确构建。为您的发行版打开一个错误。

于 2012-05-05T05:34:51.560 回答