未定义的引用

时间:2010-11-01 11:10:07

标签: c++ netbeans compilation static-libraries

我使用了客户端提供的静态库,并且库没有命名为“lib * .a”,那么在编译时如何使用它。

我尝试将其添加为库(类似于“-l *”),但后来我找不到-l *,我想这是因为它试图找到“lib * .a”。

然后我将文件名作为参数放在命令行中的绝对路径,然后我得到“链接器输入文件未使用,因为链接未完成”,以及许多未定义的引用。我也尝试过命令行来编译cpp文件,我可以在没有任何警告或错误的情况下获取目标文件。

我的问题是如何使用Netbeans中的这种库来构建项目?

另一个问题是终端,我得到目标文件后该怎么办?这可能有点愚蠢,但我是c ++的新手,所以希望任何人都可以帮助我,因为我真的很困惑,在谷歌找不到任何直接的答案。

提前感谢。

3 个答案:

答案 0 :(得分:2)

将库重命名为libwhatever.a,然后使用-L /path/to/whatever -lwhatever链接。

答案 1 :(得分:1)

  

然后我把文件名和它在命令行中的绝对路径作为参数,然后我得到“链接器输入文件未使用,因为链接未完成”。

听起来您在编译时指定了库,但是在链接时需要指定它:

$ ls
main.cpp Makefile test.cpp
$ show test.cpp main.cpp Makefile
### test.cpp
  1 #include <stdio.h>
  2 void f() {
  3   puts("Hello, world!");
  4 }
### main.cpp
  1 void f();
  2 int main() {
  3   f();
  4   return 0;
  5 }
### Makefile
  1 main: main.cpp foo.a
  2 foo.a(test.o): test.o
  3 foo.a: foo.a(test.o)
$ make
g++    -c -o test.o test.cpp
ar rv foo.a test.o
ar: creating foo.a
a - test.o
g++     main.cpp foo.a   -o main
$ ./main
Hello, world!

如果您的makefile在编译时使用LDLIBS(默认情况下可能会这样做),那么您可以将foo.a添加到LDLIBS。为了一个更简单的例子,我没有这样做。

答案 2 :(得分:0)

显然你正在使用* nix编译器。

尝试指定执行链接的调用的库路径。

显然,您已将其指定为带有“-c”选项的调用,该选项不链接(仅编译)。

编辑:示例(包括错误):

Alf@SpringFlower ~/leo
$ mkdir lib; cd lib

Alf@SpringFlower ~/leo/lib
$ cat >foo.cpp
int foo() { return 42; }

Alf@SpringFlower ~/leo/lib
$ g++ -c foo.cpp

Alf@SpringFlower ~/leo/lib
$ ar -s foolib.a foo.o
ar: 'foolib.a': No such file

Alf@SpringFlower ~/leo/lib
$ ar -rs foolib.a foo.o
ar: creating foolib.a

Alf@SpringFlower ~/leo/lib
$ ls
foo.cpp  foo.o  foolib.a

Alf@SpringFlower ~/leo/lib
$ cd ..

Alf@SpringFlower ~/leo
$ cat >main.cpp
extern int foo();
#include <iostream>
int main()
{ std::cout << foo() << std::endl; }

Alf@SpringFlower ~/leo
$ g++ -c main.cpp

Alf@SpringFlower ~/leo
$ g++ main.o lib/foolib.a

Alf@SpringFlower ~/leo
$ a
bash: a: command not found

Alf@SpringFlower ~/leo
$ ./a
42

Alf@SpringFlower ~/leo
$ _

干杯&amp;第h。,