У меня есть CMakeList.txt, который собирает статическую библиотеку:
project(SharedComponents C)
cmake_minimum_required(VERSION 3.12)
set(CMAKE_C_STANDARD 99)
include_directories(../include)
add_library(SharedComponents STATIC ATMIDIUtils.c ../include/ATMIDIUtils.h)
ATMIDIUtils.c
void splitMIDIValue(MIDILongValue value, MIDIValue * _Nonnull separated)
{
separated->MSB = (value >> 7) & ATMIDIMaxValue;
separated->LSB = value & ATMIDIMaxValue;
}
ATMIDIUtils.h
void splitMIDIValue(MIDILongValue value, MIDIValue * _Nonnull separated);
Это нормально компилируется. Затем я пытаюсь создать модульный тест и связать с ним, и он говорит, что символ отсутствует:
Undefined symbols for architecture x86_64:
"splitMIDIValue(unsigned short, MIDIValue*)", referenced from:
ATMIDIUtilsTests_test_split_midi_value_Test::TestBody() in ATMIDIUtilsTests.cxx.o
nm показывает, что символ является внешним:
0000000000000330 (__TEXT,__text) external _splitMIDIValue
Почему в моей библиотеке отсутствуют все символы? ATMIDIUtils.c содержит реализацию функции, но, похоже, она не компилируется в статическую библиотеку.





Why are all the symbols missing from my library? ATMIDIUtils.c contains the function implementation but it seems it is not getting compiled into the static lib.
Они там, и nm(1) вам об этом говорит. Компоновщик просто не находит символ, потому что вы скомпилировали библиотеку с помощью компилятора C, но модульный тест находится на C++.
Перед прототипом функции отсутствует extern "C". обычно заголовок в целом помещается в блок extern "C" при условии определения __cplusplus, например:
#ifndef ATMIDI_UTILS_H_
#define ATMIDI_UTILS_H_
#ifdef __cplusplus
extern "C" {
#endif
void splitMIDIValue(MIDILongValue value, MIDIValue * _Nonnull separated);
#ifdef __cplusplus
}
#endif
#endif /* ATMIDI_UTILS_H_ */
Отметьте этот ответ, чтобы узнать, почему это необходимо: https://stackoverflow.com/a/11257433/1257035
@Nick external означает, что у них есть внешняя связь (т. Е. Экспортирована). Отсутствующие символы не определены.
Большое спасибо, что меня действительно сбили с толку! Как бы выглядел
nm, если бы не было символов? Я думал, что внешний означает, что их нет в библиотеке.