Size: a a a

2020 December 15

II

Igor Ivanov in pro.cxx
Aidar Fattakhov
Че такое lib?
статическая либа, которой не повезло заиметь функцию с таким же именем, которое уже есть в экзешнике
источник

EE

Ender Eyre in pro.cxx
Igor Ivanov
кажется, мои знания линковки в плюсах слегка заржавели, опять

 $ 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 ?..
в плюсах нет линковки.
источник

AF

Aidar Fattakhov in pro.cxx
Igor Ivanov
статическая либа, которой не повезло заиметь функцию с таким же именем, которое уже есть в экзешнике
Статическая либа в личиенксе это просто набор объектников
источник

AF

Aidar Fattakhov in pro.cxx
Ты точно в нем?
источник

II

Igor Ivanov in pro.cxx
*проверил*
$ uname -a
Linux workpc 4.19.152-1-MANJARO #1 SMP Sat Oct 17 10:51:27 UTC 2020 x86_64 GNU/Linux

по-моему да
источник

AF

Aidar Fattakhov in pro.cxx
Ну значит оно действительно берет первое
источник

AF

Aidar Fattakhov in pro.cxx
Сдампай символы и убедись
источник

II

Igor Ivanov in pro.cxx
@unterumarmung подкинул любопытную тему, пока сам же её и не стёр — если при сборке бинаря в него попадают два объектника (а не объектник и либа), то вот тогда всё действительно падает как надо

вопрос тогда получается, чем линковка .a отличается от линковки .o в этом случае, с точки зрения резолвинга символов 🤔
источник

II

Igor Ivanov in pro.cxx
хм, кажется оно
https://stackoverflow.com/questions/24390267/why-redefinition-of-a-function-which-is-already-present-in-dynamic-or-static-lib
The reason for the difference in functionality is that there are different types of symbols.
A library function is a weak symbol. It is only included if it is not already defined.
источник

AT

Alexander Tulikov in pro.cxx
Igor Ivanov
и всё бы ничего, но
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
Линкер сначала просматривает локальные объектные файлы, если не находит символ, то начинает просматривать объектные файлы из библиотек по очереди. Если в процессе будут найдены одинаковые символы, то будет ошибка multiple definition, но в твоём случае её нет, т.к. все символы из библиотеки есть и в локальных объектных файлах.
источник

II

Igor Ivanov in pro.cxx
Alexander Tulikov
Линкер сначала просматривает локальные объектные файлы, если не находит символ, то начинает просматривать объектные файлы из библиотек по очереди. Если в процессе будут найдены одинаковые символы, то будет ошибка multiple definition, но в твоём случае её нет, т.к. все символы из библиотеки есть и в локальных объектных файлах.
вроде совпадает с тем, что я вычитал на SO
спасибо, буду учитывать
источник

AT

Alexander Tulikov in pro.cxx
Weak symbol это отдельный механизм связывания, там по ссылке в wiki можно почитать, не имеет отношения к обычным библиотекам в привычном понимании.
источник

S

Stas in pro.cxx
magras
Нельзя брать адрес функций из стандартной библиотеки.
На сколько я понимаю, это позволяет комитету менять сигнатуру не ломая пользовательский код, например, добавив в конец списка аргументов новый аргумент со значением по-умолчанию.
А можно пример такой функции?
источник

S

Stas in pro.cxx
То есть ту, в которой добавили параметр по умолчанию.
источник

D

Danya in pro.cxx
Буквально только что в супе обсуждали это))
источник

D

Danya in pro.cxx
Переслано от Александр Караев...
источник

D

Danya in pro.cxx
Stas
А можно пример такой функции?
Короче можно брать адрес только у I/O манипуляторов
источник

m

magras in pro.cxx
Stas
То есть ту, в которой добавили параметр по умолчанию.
По-моему с конструкторами было много подобных примеров, правда в обратном направлении:
ctor(T t = {});
на
ctor();
explicit ctor(T t);
источник

D

Danya in pro.cxx
А сорри, я не дочитал сообщение, а которое ответили
источник

АС

Анатолий Снеговский... in pro.cxx
Великие гуру, не могли бы вы помочь мне в решении довольно интересно (надеюсь не только для меня) задачки

мне необходимо сделать циклическую архитектуру классов.

то есть есть базовый класс который методами вызывает дочерние классы

своего рода билдер в перемешку с абстрактным методом

вызов начинается с дочернего класса

проблема заключается в том что не смотря на то что подключены заголовочные файлы компилятор ругается и говорит что не видит класса дочернего объекта
источник