170 похожих чатов

Кажется, мои знания линковки в плюсах слегка заржавели, опять $

cat CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(link)
add_executable(test main.cpp foo-test.cpp)
add_library(lib foo-real.cpp)
target_link_libraries(test PRIVATE lib)
$ cat main.cpp
#include "foo.h"
int main() { return foo(); }
$ cat foo.h
#pragma once
int foo();
$ cat foo-real.cpp
int foo() { return 0; }
$ cat foo-test.cpp
int foo() { return 1; }

$ cmake --build b
[5/5] Linking CXX executable test
$ ./b/test; echo $?
1
почему здесь нет бабаха про multiple definitions: foo@real.cpp, foo@test.cpp ?..

8 ответов

4 просмотра

Потому что UB?

ODR проверяет компилятор, линкеру на это плевать, он берёт первый найденный символ.

multiple definitions более менее детектится на винде линкером msvc, на линуксе он то ли не детектит, то ли не всегда

Igor-Ivanov Автор вопроса
Alexander Tulikov
ODR проверяет компилятор, линкеру на это плевать, ...

и всё бы ничего, но add_executable(test main.cpp foo-test.cpp foo-real.cpp ) $ cmake --build b [1/1] Linking CXX executable test FAILED: test : && /usr/bin/clang++ CMakeFiles/test.dir/main.cpp.o CMakeFiles/test.dir/foo-test.cpp.o CMakeFiles/test.dir/foo-real.cpp.o -o test && : /usr/bin/ld: CMakeFiles/test.dir/foo-real.cpp.o: in function `foo()': foo-real.cpp:(.text+0x0): multiple definition of `foo()'; CMakeFiles/test.dir/foo-test.cpp.o:foo-test.cpp:(.text+0x0): first defined here

Ну ты сделал какой-то всратый аналог инкрементальной линковки яполагаю

в плюсах нет линковки.

Igor Ivanov
и всё бы ничего, но add_executable(test main.cpp...

Линкер сначала просматривает локальные объектные файлы, если не находит символ, то начинает просматривать объектные файлы из библиотек по очереди. Если в процессе будут найдены одинаковые символы, то будет ошибка multiple definition, но в твоём случае её нет, т.к. все символы из библиотеки есть и в локальных объектных файлах.

Igor-Ivanov Автор вопроса
Alexander Tulikov
Линкер сначала просматривает локальные объектные ф...

вроде совпадает с тем, что я вычитал на SO спасибо, буду учитывать

Похожие вопросы

Обсуждают сегодня

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
Привет всем. Не знаю, удачный ли чатик я выбрал для вопроса, но он как будто в целом про концепцию фп и конкретно про Haskell. Прочитал, что в целом в мире фп нет идеи мутабел...
Gellert Cringewald
15
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
Читаю сейчас [нет, уже больше не читаю!] курсовую о Булгакове, написанную, похоже, с помощью ChatGPT. Это удивительный психоделический опыт. Текст в основном написан в стиле б...
✨ Uni [🌊 В отпуске]
1
Всем привет! поделитесь, пож-та, как кто дебажил / решал проблему с 504 Time out ошибкой от nginx, когда стучишься на свой vapor сервер? в логах /var/log/nginx/error.log е...
Paul
24
Как добавить ссылку в Быстрый доступ в Проводнике windows 10? Нашёл, как на power shell сделать, но может есть способ через Дельфи?
А
31
@helgispbru @Dreamer_0x01 @Pathologic93 @webber_12 Не уверен, что вам всем это жутко интересно, но в продолжение недавнего диалога отправлю свои наброски. Хочу понять, правил...
Андрей [aharito] Харитонов
13
Всем, привет! Подскажите, пожалуйста, самую лёгкую, быструю, лаконичную и адаптивную тему для WP? Бесплатно или чтобы можно было в РФ оплатить доступ к теме. Раньше брал на...
Евгений Грак
14
Подскажите, пожалуйста, как с массивами данных в 1.4 работать? Есть сниппет, который возвращает массив объектов. В 3 все понятно на блейде, а здесь ..
Никита Ковалёв
12
Карта сайта