Последние версии 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 вызвали его необходимо.