Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: CMake. Линковка статической библиотеки  (Прочитано 6599 раз)
0 Пользователей и 1 Гость смотрят эту тему.
demon051
Помогающий

ru
Offline Offline

« : 23-09-2021 08:00 » 

Всем привет.
Попал в какую-то глупую ситуацию...
На пальцах.
Есть либа для примера с одной функцией hello, выводящей текст

Код: (C++)
//lib.c
#include <stdio.h>
#include <lib.h>

void hello()
{
printf("Hello world! I'm static library\n");

}

Код: (C++)
//lib.h
#ifndef LIB_H
#define LIB_H

void hello();
#endif // LIB_H


Собирается как статическая
Код: (C++)
#CMAkeLists.txt
project(mylib)
set(SOURCES lib.c)
set(HEADERS lib.h)
add_library(mylib ${SOURCES} ${HEADERS})
target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

Всё ок. 
Получается файл libmylib.a

Теперь пытаюсь связать его с проектом, например
Код: (C++)
#include <iostream>
#include "lib.h"
using namespace std;
void hello();
int main(int argc, char *argv[])
{
        cout << "Hello World!" << endl;
        hello();
        return 0;
}

Файл для сборки такой
Код: (C++)
#CMAkeLists.txt
cmake_minimum_required(VERSION 2.8)

project(TestLib)

option(USE_STATIC "Use static library" ON)

find_library(MYLIBRARY mylib /home/user/projects/TestLib/mylib/build-mylib-armhf-Default)

message("--------------------------------------------")
message(lib path = ${MYLIBRARY})
message("--------------------------------------------")


add_executable(TestLib "main.cpp")

target_link_libraries(TestLib PRIVATE ${MYLIBRARY})

target_include_directories(TestLib PUBLIC ${PROJECT_SOURCE_DIR}/mylib)

При попытке собрать проект получаю сообщение

/home/user/projects/TestLib/main.cpp:-1: error: undefined reference to `hello()'


И впадаю в ступор )) Что не так???
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 23-09-2021 20:28 » 

Странно. У меня как правило с расширением ,o. Но это не суть важно. Покажи, как формируется окончательный сборшик gcc. Скорее всего твоя библитека просто не подключается при окончательной линковке.

Только что обратил внимание. А нафига ты прописал void hello(); в main.cpp? Ты же переназначил функцию. А затем ее не определил. Вот она тебя и ругает.
« Последнее редактирование: 23-09-2021 20:34 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 23-09-2021 20:49 » 

Не, скорее всего дело в смешении C и С++. Это не одно и тоже.
Либо lib.cpp, либо extern "C" void hello();

Код: (C)
//lib.h
#ifndef LIB_H
#define LIB_H

extern "C" void hello();
#endif // LIB_H

И убрать объявление в головном модуле.

Секрет прост: C генерит символ (линковочное имя), полностью идентичный имени функции, когда как C++ к имени цепляет многое, включая namespace, класс, аргументы.

objdump -t main.o|grep hello
0000000000000000         *UND*  0000000000000000 _Z5hellov

objdump -t main.o|grep hello
0000000000000000         *UND*  0000000000000000 hello
« Последнее редактирование: 23-09-2021 20:52 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
demon051
Помогающий

ru
Offline Offline

« Ответ #3 : 27-09-2021 05:03 » new

Не, скорее всего дело в смешении C и С++. Это не одно и тоже.
Либо lib.cpp, либо extern "C" void hello();

Код: (C)
//lib.h
#ifndef LIB_H
#define LIB_H

extern "C" void hello();
#endif // LIB_H

И убрать объявление в головном модуле.

Секрет прост: C генерит символ (линковочное имя), полностью идентичный имени функции, когда как C++ к имени цепляет многое, включая namespace, класс, аргументы.

objdump -t main.o|grep hello
0000000000000000         *UND*  0000000000000000 _Z5hellov

objdump -t main.o|grep hello
0000000000000000         *UND*  0000000000000000 hello

добрый день.

да, дело было в смешении с и с++
как-то сразу не сообразил.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines