cmake делает все символы в статической lib внешними - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть 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

нм показывает, что символ является внешним:

0000000000000330 (__TEXT,__text) external _splitMIDIValue

Почемувсе символы отсутствуют в моей библиотеке?ATMIDIUtils.c содержит реализацию функции, но, похоже, она не компилируется в статическую библиотеку.

1 Ответ

0 голосов
/ 04 декабря 2018

Почему все символы отсутствуют в моей библиотеке?ATMIDIUtils.c содержит реализацию функции, но, похоже, она не компилируется в статическую библиотеку.

Они там, и 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...