C++ неопределенные ссылки со статической библиотекой

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

g++ -c myClass.cpp -o myClass.o

и затем упаковка его с

ar rcs myClass.lib myClass.o

Существует что-то, что я, очевидно, пропускаю обычно с этим. Я держал пари, что это - что-то с символами. Спасибо за любой совет я знаю, что это - по всей вероятности что-то, что я мог узнать при чтении некоторого учебного руководства очень жаль при беспокойстве глупым материалом снова :)

править:

myClass.h:

class myClass{
    public:
        myClass();
        void function();
};

myClass.cpp:

#include "myClass.h"

myClass::myClass(){}
void myClass::function(){}

программа с помощью класса:

#include "myClass.h"

int main(){
myClass mc;
mc.function();

return 0;
}

наконец я компилирую его как это:

g++ -o main.exe -L. -l myClass main.cpp

ошибка является просто классической:

C:\Users\RULERO~1\AppData\Local\Temp/ccwM3vLy.o:main.cpp:(.text+0x31): undefined
 reference to `myClass::myClass()'
C:\Users\RULERO~1\AppData\Local\Temp/ccwM3vLy.o:main.cpp:(.text+0x3c): undefined
 reference to `myClass::function()'
collect2: ld returned 1 exit status
49
задан hmatar 4 March 2017 в 14:50
поделиться

2 ответа

Это вероятно проблема порядка ссылок. Когда компоновщик GNU видит библиотеку, он отбрасывает все символы, которые ему не нужны. В этом случае ваша библиотека появляется перед вашим файлом .cpp, поэтому библиотека удаляется до компиляции файла .cpp. Сделайте следующее:

g++ -o main.exe main.cpp -L. -lmylib

или

g++ -o main.exe main.cpp myClass.lib

Компоновщик Microsoft не учитывает порядок библиотек в командной строке.

114
ответ дан 7 November 2019 в 11:21
поделиться

Использование:

g++ -o main.exe main.cpp myClass.lib 

Использование пути к библиотеке и флага -l чревато проблемами, но если вы должны это сделать, переименуйте вашу библиотеку в libmylib. a, а затем скомпилировать как:

g++ -o main.exe main.cpp -L. -lmylib 

Обратите также внимание на то, что по причинам переносимости обычно плохая идея использовать смешанный регистр в именах исходных или выходных файлов.

5
ответ дан 7 November 2019 в 11:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: