Рассмотрим следующий код (он не является специфичным для других; другие примеры, например, связанные с библиотекой реального времени, демонстрируют аналогичное поведение):
#define _GNU_SOURCE
#include <pthread.h>
inline void foo() {
static cpu_set_t cpuset;
pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
}
int main(int argc, char *argv[]) { }
Это допустимая программа на C и C ++. Поэтому я сохраняю содержимое этого файла в testc.c
и testcpp.cpp
и пытаюсь собрать.
Когда я встраиваю C++
, я не получаю ошибки. Когда я встраиваю C
, я получаю неопределенную ошибку ссылки. Теперь эта ошибка возникает в -O1
и в -O3
. В любом случае можно ли дать команду gcc правильно поступить (см., Что foo
не используется и пропущено требование для определения pthread_setaffinity_np
)?
РЕДАКТИРОВАТЬ: Я думал, что это было очевидно из контекста, но сообщение об ошибке:
/tmp/ccgARGVJ.o: In function `foo':
testc.c:(.text+0x17): undefined reference to `pthread_setaffinity_np'
Обратите внимание, что, поскольку на foo
нет ссылки в основном пути, g++
корректно полностью игнорирует функцию, а gcc
- нет.
РЕДАКТИРОВАТЬ 2: Позвольте мне попробовать это еще раз. Функция foo
и последующий вызов pthread_setaffinity_np
не используются. Основная функция пуста. Просто посмотрите на это! Каким-то образом g++
выяснил, что foo
не нужно было включать, и впоследствии процесс сборки не запустился, когда мы намеренно пропустили -lpthread
(а проверка экспортированных символов с помощью nm
подтверждает, что ни foo
ни ссылка на pthread_setaffinity_np
не требовалась). Результирующий вывод gcc
не подхватил этот факт.
Я задаю этот вопрос, потому что интерфейсы C ++ и C, похоже, дают разные результаты для одного и того же ввода. Похоже, это не проблема ld
prima facie, потому что я ожидаю, что оба пути приведут к одной и той же ошибке компоновки, поэтому я подчеркнул, что это проблема компилятора. Если бы и C ++, и C создавали проблемы, тогда да, я бы согласился, что это проблема связывания