Ответ 1
Последние версии gcc/ld по умолчанию связаны с --as-needed
.
Это означает, что если вы пишете -lexternal
перед C файлом, библиотека будет автоматически исключена (порядок имеет значение при тестировании, если это так необходимо)
Вы можете исправить это с помощью любого из:
-
gcc -L. -o program program.c -lexternal
-
gcc -L. -Wl,--no-as-needed -lexternal -o program program.c
Последний из них передает --no-as-needed
в компоновщик, что приведет к тому, что библиотека все еще будет связана, даже если вы не вызывали из нее external()
.
Примечание. -Wl,--no-as-needed
не применяется глобально ко всему, что связано, оно применяется только к тем, которые следуют за ним в порядке командной строки. Так что -lexternal -Wl,--no-as-needed
тоже не сработает. Это означает, что вы можете смешивать и сопоставлять поведение, хотя, например, gcc -L. -Wl,--no-as-needed -lexternal -Wl,--as-needed -o program program.c -lmightneed
всегда ссылается на внешнюю, но только на ссылку против потенциального, если один или оба из program.c/libexternal.so заставляют это быть необходимым.