2010-11-01 98 views
0

我使用了一个客户端提供的静态库,并且该库没有命名为“lib * .a”,那么在编译时如何使用它。我试图添加它作为库(类似于“-l *”),但后来我找到了-l *,我猜这是因为它试图找到一个“lib * .a”。未定义的引用

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

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

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

提前致谢。

回答

0

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

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

显然你已经用“-c”选项指定了它,它没有链接(仅编译)。

EDIT:例如(包括erors):

 
[email protected] ~/leo 
$ mkdir lib; cd lib 

[email protected] ~/leo/lib 
$ cat >foo.cpp 
int foo() { return 42; } 

[email protected] ~/leo/lib 
$ g++ -c foo.cpp 

[email protected] ~/leo/lib 
$ ar -s foolib.a foo.o 
ar: 'foolib.a': No such file 

[email protected] ~/leo/lib 
$ ar -rs foolib.a foo.o 
ar: creating foolib.a 

[email protected] ~/leo/lib 
$ ls 
foo.cpp foo.o foolib.a 

[email protected] ~/leo/lib 
$ cd .. 

[email protected] ~/leo 
$ cat >main.cpp 
extern int foo(); 
#include <iostream> 
int main() 
{ std::cout << foo() << std::endl; } 

[email protected] ~/leo 
$ g++ -c main.cpp 

[email protected] ~/leo 
$ g++ main.o lib/foolib.a 

[email protected] ~/leo 
$ a 
bash: a: command not found 

[email protected] ~/leo 
$ ./a 
42 

[email protected] ~/leo 
$ _ 

干杯& HTH,

+0

那么,我试着用-g,然后即使在命令行中也会出现错误。无处不在我从lib中调用方法。我在链接器中指定目录,但它不起作用。 – leo 2010-11-01 12:36:53

+0

我用-L指定目录,但没有帮助。仍然有很多未定义的参考。是否有任何可能的原因为未定义的参考文献 – leo 2010-11-01 12:38:47

+0

Dunno。我在上面添加了一个例子。希望有人对你的编译器和操作系统更熟悉。顺便说一下,你的编译器和操作系统是什么**。我认为这有点相关...... ;-)干杯, – 2010-11-01 12:54:48

2

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

+1

这实际上是我见过的最令人敬畏的答案。 xD – 2010-11-01 14:39:45

+0

谢谢,我试过了,它不起作用。在搜索时跳过了不兼容的libwhatever.a -lwhatever – leo 2010-11-01 14:44:37

+0

@leo您使用的是哪种体系结构?作为一个例子,该库可能已经为ppc64构建,但是你可能没有'-m64'标记进行链接。 – 2010-11-01 14:46:10

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。为了更简单的例子,我没有这样做。