C ++ Ссылка только на нужную часть статической библиотеки - PullRequest
3 голосов
/ 06 декабря 2011

Я пытаюсь связать некоторые части статической библиотеки в программу, написанную на C ++ с использованием g ++ под Linux.

my_lib.h

#ifdef USE_EXTERN_LIB
# include <extern_lib.h>
void do_something (struct extern_lib);
#endif

void do_other (int);

my_lib.c

#include "my_lib.h"

#ifdef USE_EXTERN_LIB
void do_something (struct extern_lib l)
{
  // do something
}
#endif

void do_other (int a)
{
  // do something
}

Я статически создаю libmy_lib.a с флагом препроцессора -DUSE_EXTERN_LIB, чтобы включить в него все.

но я хочу создать две программы: одну, которая использует эту библиотеку с * extern_lib *, и другую, которая использует ее без * extern_lib *, т.е.

g++ -L/path/to/lib -lmy_lib -o prog_wihtout_lib prog_without_lib.cc 
g++ -DUSE_EXTERN_LIB -L/path/to/lib -lmy_lib -o prog_with_lib prog_with_lib.cc

Вторая программа компилируется, но не первая, она говорит, что extern_lib не объявлена.

С динамической библиотекой проблем нет, потому что символы загружаются во время выполнения, но я хочу статическую библиотеку. Есть ли способ связать только нужные модули статической библиотеки?

EDIT

prog_without_lib.cc

#include "my_lib.h"

int main ()
{
  do_other (42);

  return 0;
}

prog_with_lib.cc

#include "my_lib.h"

int main ()
{
  do_other (42);

  struct extern_lib l;
  do_something (l);

  return 0;
}

Спасибо.

Ответы [ 2 ]

4 голосов
/ 06 декабря 2011

Просто сделайте ссылку в библиотеке, и пусть компоновщик беспокоится об удалении неиспользуемого кода. Это его работа.

То, что вы пытаетесь сделать, не имеет смысла (и нет, это также не имело бы смысла в динамической библиотеке). Определения действуют только при компиляции библиотеки, и вы делаете это в первой строке. Во второй строке вы просто связываете уже скомпилированную библиотеку в свой исполняемый файл. Но на самом деле весь смысл статических библиотек в том, что они видны компоновщику, поэтому он может (помимо всего прочего) удалять любой неиспользуемый код. Так зачем вам вообще определять USE_EXTERN_LIB?

0 голосов
/ 06 декабря 2011

Вы должны добавить внешнюю библиотеку в командную строку при сборке во второй командной строке:

g++ -DUSE_EXTERN_LIB -I/path/to/external_lib/headers -o prog_wih_lib prog_with_lib.cc -L/path/to/external_lib/libfile -lexternal_lib -lmy_lib

Также обратите внимание, что я поставил библиотеки в конце командной строки.Это может быть больше не нужно, но раньше компоновщик сканировал входные файлы в том порядке, в котором они были заданы в командной строке, поэтому, если библиотека находилась в командной строке до того, как объектный файл использовал ее, компоновщик завершал работу сошибка о том, что символы не найдены.

...