LINUX.ORG.RU

Программа С++ не линкуется с сишными либами :(


0

0

Есть две библиотеки «С» lib1, lib2. lib2 использует функции lib1. Есть программа на С++. В ней используются функции lib2.

Структура директорий:

$ tree
.
|-- lib1
|   |-- lib1.c
|   `-- lib1.h
|-- lib1.a
|-- lib1.o
|-- lib2
|   |-- lib2.c
|   `-- lib2.h
|-- lib2.a
|-- lib2.o
`-- prog
    `-- main.cpp

lib1.h

void lib1_print(const char *szWhat);

lib1.c

#include <stdio.h>

void lib1_print(const char *szWhat)
{
	printf(szWhat);
}

lib2.h

void lib2_print(const char *szWhat);

lib2.c

#include "../lib1/lib1.h"

void lib2_print(const char *szWhat)
{
	lib1_print(szWhat);
}

main.cpp

extern "C"
{
#include "../lib2/lib2.h"
}

int main()
{
	lib2_print("hello");
}

Компилирую:

$ gcc -c lib1/lib1.c -o lib1.o && ar -r lib1.a lib1.o
lib1/lib1.c: In function ‘lib1_print’:
lib1/lib1.c:5: warning: format not a string literal and no format arguments
$ gcc -c lib2/lib2.c -o lib2.o && ar -r lib2.a lib2.o
$ g++ -o out prog/main.cpp -l1 -l2 -L./
.//lib2.a(lib2.o): In function `lib2_print':
lib2.c:(.text+0xd): undefined reference to `lib1_print'
collect2: ld returned 1 exit status

Кто знает, в чем проблема?

$ g++ -o out prog/main.cpp -l1 -l2 -L./ 

Попробуй поменять -l1 -l2 местами. То есть:

$ g++ -o out prog/main.cpp -l2 -l1 -L./ 

undet
()

Надо поменять местами -l1 и -l2 при последнем вызове gcc. Линковщик принимает к сведению аргументы по порядку слева направо. К моменту -l1 он еще не знает, какие символы оттуда потребуются, поэтому игнорирует все, ссылки на которые не встретились ему в более ранних аргументах. К моменту -l2 нужные символы ему взять уже неоткуда.

gzh
()

поставь -L ПЕРЕД -l, а для статических библиотек вообще лучше прописывать имя файла вместо -L -l флагов

annulen ★★★★★
()
Ответ на: комментарий от annulen

> а для статических библиотек вообще лучше прописывать имя файла вместо -L -l флагов

Почему лучше? В руководстве по GCC пишут: «The only difference between using an -l option and specifying a file name is that -l surrounds library with `lib' and `.a' and searches several directories».

undet
()
Ответ на: комментарий от undet

>Почему лучше?

потому что если вдруг есть динамическая либа с таким же названием, будет использована именно она.

annulen ★★★★★
()
Ответ на: комментарий от annulen

>потому что если вдруг есть динамическая либа с таким же названием, будет использована именно она.

man ld на предмет -B и больше не советуй глупости

Led ★★★☆☆
()
Ответ на: комментарий от annulen

> -Bstatic слинкует статически все, а не только нужную библотеку

-Bstatic слинкует статически все, что идёт после него

Led ★★★☆☆
()
Ответ на: комментарий от Led

например:

gcc ... -Wl,-Bstatic -lfoo1 -Wl,-Bdynamic -lfoo2 ...

libfoo1 слинкуется статически, libfoo2 - динамически.

Led ★★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.