Cmake делает все символы в статической библиотеке внешними

У меня есть 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 содержит реализацию функции, но, похоже, она не компилируется в статическую библиотеку.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
84
1

Ответы 1

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

Большое спасибо, что меня действительно сбили с толку! Как бы выглядел nm, если бы не было символов? Я думал, что внешний означает, что их нет в библиотеке.

Nick 04.12.2018 15:35

@Nick external означает, что у них есть внешняя связь (т. Е. Экспортирована). Отсутствующие символы не определены.

a3f 04.12.2018 22:07

Другие вопросы по теме