Этот пример состоит из нескольких файлов:
// baz.cxx
int wat = 0;
int counter = ++wat;
// foo.cxx (empty)
// bar.cxx (empty)
// main.cxx
#include <iostream>
extern int wat;
int main() {
std::cout << wat << '\n';
}
// makefile
run : main.cxx foo.so bar.so
g++ -std=c++11 $^ -o [email protected]
baz.a : baz.cxx
g++ -std=c++11 -c $^ -o baz.o -fPIC
ar rcs [email protected] baz.o
%.so : %.cxx baz.a
g++ -std=c++11 $< -Wl,--whole-archive baz.a -Wl,--no-whole-archive -o [email protected] -shared -fPIC
As-is, если вы просто запустите make && LD_LIBRARY_PATH=. ./run
, все с компиляцией, сборкой, ссылкой, запуском и выпуском 2
. Это связано с тем, что foo.so
и bar.so
предоставляют wat
, а инициализация для counter
выполняется дважды.
Есть ли способ каким-то образом заставить run
не связываться с ошибкой множественного определения в этом случае, сохраняя при этом, что оба foo.so
и bar.so
имеют определение для wat
?