2013-10-30 49 views
4

我已经下载并编译:http://leenissen.dk/fann/wp/错误 “未定义的引用'罪” 编译(带-lm)时

  • cmake的版本2.8.11.2
  • GCC(Ubuntu的/ Linaro的4.8.1- 10ubuntu8)使用4.8.1

命令编译:

cmake -D CMAKE_INSTALL_PREFIX:PATH=/usr . 

安装:

sudo make && sudo make install 

然后我去的例子/目录范文芳项目中,并尝试通过运行编译例子:

make all 

我得到一个错误:

gcc -O3 xor_train.c -o xor_train -lfann -lm 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `sin' 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `exp' 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `cos' 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `log' 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `pow' 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `sqrt' 
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so: undefined reference to `floor' 
collect2: error: ld returned 1 exit status 
make: *** [xor_train] Error 1 

更新:

  • 我遵循图书馆给出的指示
  • 我检查了另一台机器,并提供了指示工程,因此我猜想我的环境存在某种配置错误。

有关共享库的依赖一些更多的信息:

ldd /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libfann.so 
    linux-vdso.so.1 => (0x00007fff3abfe000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6f3997c000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f6f39f84000) 

如建议通过轮候册编译@迈克尔毛刺,-v

/usr/bin/ld --sysroot=/ \ 
    --build-id --eh-frame-hdr -m elf_x86_64 \ 
    --hash-style=gnu --as-needed \ 
    -dynamic-linker /lib64/ld-linux-x86-64.so.2 \ 
    -z relro -o xor_train \ 
    /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o \ 
    /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o \ 
    /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o \ 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.8 \ 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu \ 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib \ 
    -L/lib/x86_64-linux-gnu \ 
    -L/lib/../lib -L/usr/lib/x86_64-linux-gnu \ 
    -L/usr/lib/../lib \ 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. \ 
    -v /tmp/cc0AHZgU.o -lfann -lm -lgcc --as-needed -lgcc_s --no-as-needed \ 
    -lc -lgcc --as-needed -lgcc_s --no-as-needed \ 
    /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o \ 
    /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o 
GNU ld (GNU Binutils for Ubuntu) 2.23.52.20130913 
+1

是否遵循与库提供构建指令?通常这是在一个名为'README'或'INSTALL'的文件中。 – paddy

+1

可能的重复[未定义引用\'sin \'in C](http://stackoverflow.com/questions/5005363/undefined-reference-to-sin-in-c) –

+4

@ZachStark不,它不是重复的。我正在添加正确的库,并且编译选项的顺序是正确的。我花了很多时间来解决所有类似的问题。没有人有同样的问题。 –

回答

5

根本原因:缺少FANN库中的依赖关系(将向作者发送补丁)。这种依赖性被称为“inter library dependency”。

可能发生的是一个构建一个共享库一个,没有正确的依赖关系设置(假设)。 在这种情况下,共享库A将生成没有任何错误味精,因为它不需要在编译期间提供实现。

的问题将出现缺少库当一个尝试创建取决于一个的可执行文件。

在这种特定情况下的解决方案是根据CMake manual

例changeline修改CMake的配置文件:

TARGET_LINK_LIBRARIES(fann m) 
+0

我碰巧遇到同样的问题。你能告诉我我真的需要做些什么来解决它吗?这个问题似乎有一个附加的答案,但似乎并不适用于我。 –

+2

这里是我的FANN的副本,更新了CMakeList.txt以包含-lm作为依赖项:https://github.com/orian/fann-1(我使用作者推荐的命令在Ubuntu上编译它) –

0

它看起来像你的编译自己的程序为64位,但FANN库为32位。编译时可能需要指定FANN的体系结构,这可能意味着修改makefile中的GCC标志,除非有autoconf设置为您执行。假设你想要64位FANN。

或者,您可以在编译自己的代码时指定32位体系结构。

+0

你能解释你是如何得出这个假设的? ? (我渴望知识) –

+1

因为所有错误消息都使用相对于'x86_64'库的路径来查找'/ usr/lib/libfan.so',这表明编译器正在使用64位目标。如果'libfan'是64位的,它应该在'/ usr/lib64'中。 – paddy

+0

我认为在目前的Ubuntu64/usr/lib中是共享库的默认目录,它们都是64位,这些不是64的有一个特殊的lib32。 –

相关问题