LINUX.ORG.RU

GCC и сломанный линковщик

 , , ,


0

2

Имеет минт с

gcc version 4.8.4
Имеем код на цпп из трёх файлов:
//t1st.cpp
#include "t1st.h"

void getout() 
{
    printf("text");
}

//t1st.h
#include "stdio.h"

using namespace std;
extern void getout();

//l.cpp
#include "t1st.h"

int main()
{
    getout();
}

Компилируем:

g++ -fPIC -c t1st.cpp
g++ -shared -o libt1st.so t1st.o

g++ -c l.cpp
g++ -L. -lt1st -o l l.o

Получаем:

l.o: In function `main':
l.cpp:(.text+0x5): undefined reference to `getout()'
collect2: error: ld returned 1 exit status

В какую сторону копать?

Deleted

В сторону порядка линковки файлов.

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

Наличие/отсутствие extern на результат линковки не влияет. А вот компиляция на соседней машине с GCC 4.9.2 - влияет.

Deleted
()
Последнее исправление: AlarinPerfect (всего исправлений: 1)

Пальцем в небо

void getout() __attribute__((visibility("default"))
{
    printf("text");
}

и

nm libt1st.so
тоже бы помог, думаю.

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

Это зависит не от версии, а от настроек окружения. В убунте (и, подозреваю, в производных) такое включено по-дефолту. На остальных дистрибутивах не встречал. Подозреваю, машина с GCC 4.9.2 всего лишь не на убунте.

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

Подозреваю, машина с GCC 4.9.2 всего лишь не на убунте.

Да, там Debian.

Deleted
()

Ошибка в последней строчке. Надо сначала основную цель, а только потом зависимости:

g++ -o l l.o -L. -lt1st

P.S. Не люблю, когда ненужные инклуды пишут в .h файле:

#include "stdio.h"

P.S.2 А вот за это в .h файле я бы долго ругался :)

using namespace std;
Burns
()
Ответ на: комментарий от Burns

P.S.2 А вот за это в .h файле я бы долго ругался :)

Я бы тоже, но мне нужен был самый простейший пример.

А вообще, этот набор из трёх файлов родился после того как я не смог скомпилировать один проект с готовым make-файлом. Причём этот проект достаточно долго использовался в продакшене.

Deleted
()
Последнее исправление: AlarinPerfect (всего исправлений: 1)
Ответ на: комментарий от Deleted

Пока пользовался make файлом - все барахло, состоящее из глобальных дефайнов, библиотек, путей к хидерам библиотек и опции компиляции складывал в CXXFLAGS, поэтому с подобными проблемами не сталкивался. Посоветовал бы cmake, он намного удобнее и понятнее, да и редактировать его проще (в своё время достаточно намучался с этими make файлами)

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