неопределенные ссылки - PullRequest
       9

неопределенные ссылки

0 голосов
/ 01 ноября 2010

Я использовал статическую библиотеку, предоставленную клиентом, и библиотека не называется "lib * .a", тогда как использовать ее при компиляции.

Я пытался добавить его как библиотеку (аналогично "-l *"), но потом я получил -l * не найден, наверное, потому что он пытался найти "lib * .a".

Затем я поместил имя файла с его абсолютным путем в командной строке в качестве параметра, затем я получил «входной файл компоновщика не используется, так как связывание не выполнено», и множество неопределенных ссылок.Я также попытался с помощью командной строки скомпилировать файл cpp, и я могу получить объектный файл без каких-либо предупреждений или ошибок.

У меня вопрос, как построить проект с такой библиотекой в ​​Netbeans?

Еще один вопрос в терминале, что делать после получения объектного файла?Это может быть немного глупо, но я новичок в c ++, так что, надеюсь, кто-нибудь может мне помочь с этим, так как я действительно смущен и не могу найти какой-либо прямой ответ в Google.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 01 ноября 2010

переименуйте библиотеку в libwhatever.a, затем свяжите, используя -L /path/to/whatever -lwhatever.

1 голос
/ 01 ноября 2010

Затем я поместил имя файла с его абсолютным путем в командной строке в качестве параметра, затем я получил «входной файл компоновщика не используется, потому что компоновка не выполнена».

Похоже, вы указали библиотеку при компиляции, но вам нужно указать ее при компоновке:

$ 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!

Если ваш сборочный файл использует LDLIBS при компиляции, что, вероятно, происходит по умолчанию, тогда вы можете добавить foo.a в LDLIBS. Я не делал этого выше ради более простого примера.

0 голосов
/ 01 ноября 2010

Видимо, вы используете * 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
$ _

Приветствия & hth.,

...