2016-04-23 3 views
0

У меня есть main.exe и две библиотеки (Lib1 и Lib2):Есть ли способ пропустить неиспользуемые библиотеки при связывании?

В main.exe:

extern void f3(); 

int main() { 
    f3(); 
} 

В lib1.cpp:

extern void f4(); 
void f2() { 
    f4(); 
} 

void f3() { 
} 

В lib2.cpp:

void f4() { 
} 

Так теоретически, мне нужно только lib1 успешно строить main.exe, потому что только f3() вызывается main().

Тем не менее, я нашел как gcc, так и MSVC, у меня также есть lib2, в противном случае сообщения компоновщика не могут найти f4().

Я пробовал флаг компоновщика --as-needed, но это не поможет. Поэтому мой вопрос: есть ли какой-либо способ (например, флаги компоновщика), который я могу использовать для сборки main.exe успешно без lib2? Предположим, я не могу изменить какой-либо исходный код на C++.

+0

Короткий ответ: нет, нет. –

+0

Предполагая, что вы связываете статические библиотеки, когда линкер связывается с lib1 и видит, что он вызывает f4, он попытается связать lib2. Думаю, вам нужны оба. – Dan

+0

Я думаю, что в формате объектного файла не указаны все зависимости, поэтому он не может указать во время ссылки, что 'f4' не подлежит повторному использованию. – Barmar

ответ

0

Флаг --as-needed не работает, потому что линкер пытается разрешить любые неопределенные идентификаторы, которые существуют в ваших объектных файлов.

В принципе, вы должны включить реализацию f4(). Но по какой-либо причине вы не хотите предоставлять lib2 своему компоновщику, вы можете создать манекен lib2, который содержит вашу фиктивную реализацию f4 (сделать файл cpp с пустой функцией f4 будет делать трюк).

Например:

gcc main.cpp lib1.o lib2_dummy.cpp -o main.exe 
+0

Спасибо. На самом деле я сделал это, чтобы решить проблему. – stanleyli

0

Вы можете разделить lib1.cpp на два исходных модуля lib1a.cpp и lib1b.cpp и включить их в библиотеку lib1. Тогда компоновщик сможет импортировать f3 без импорта f2, и так не потребуется lib2.

lib1a.cpp

extern void f4(); 
void f2() { 
    f4(); 
} 

lib1b.cpp

void f3() { 
} 
+0

Вопрос о том, что «Предположим, что я не могу изменить какой-либо исходный код на C++» – gdlmx

Смежные вопросы