LINUX.ORG.RU

Cлинковать обьектный файл в котором уже есть main в свою программу

 , ,


0

1

Допустим, есть файлы tool.cpp, tool.h и my_tool.cpp

Где в tool.h объявлены какие-то вспомогательные функции, которые реализованы в tool.cpp. Кроме того, в tool.cpp есть main.

В my_tool.cpp мне хочется использовать все эти замечательные функции из tool.h, однако имеющийся там main мешается.

Решения здорового человека в «духе перетащить все функции в хедер», вынести main из tool.cpp понятны и разумны, но можно ли как-то сказать линкеру чтобы вместо

multiple definition of `main'; my_tool.cpp:19: first defined here

Он просто взял конкретный main, а второй выкинул?

P.S. Если собирать через afl-cc, то проблемы с линкером нет, левый main не участвует. Я посмотрел какие флаги он добавляет, но там ничего похоже нет, просто свои символы еще.

«духе перетащить все функции в хедер»

это точно не решение здорового человека.

вынести main из tool.cpp

ну вот это уже истинное решение здорового человека.

при этом, я вообще не понимаю, как в файле реализации хедера вообще взялась функция main? — это тоже решение нездорового человека.

safocl ★★
()

но можно ли как-то сказать линкеру

а почему ты уверен, что каждый линкер должен обладать такой способностью? — у некоторых допустим она есть, у других же нет.
тоесть ты намеренно хочешь привязывать свой код к какому то tool?

safocl ★★
()
Ответ на: комментарий от safocl

при этом, я вообще не понимаю, как в файле реализации хедера вообще взялась функция main

А изначально просто хедера не было и я добавил, вынеся туда нужные функции, не успел подумать что что-то не так, т.к. все замечательно собралось.

А потом попробовал собрать обычным компилятором, и проблема вылезла.

а почему ты уверен, что каждый линкер должен обладать такой способностью

Ну так это праздный интерес по большей части, я тег специально поставил и уточнил, что нормальные рещения понятны, так что просто повод погрузится в недра линковки на игрушечной задаче.

Интуитивно кажется, что линкер что-то такое должен уметь делать.

chuemir
() автор топика

Имхо, единственный по-настоящему здоровый и переносимый путь — скопипастить исходники к себе (убедившись, что лицензия того тула позволяет).
Всё остальное — пляска по граблям, если повезёт, с отложенным штрафом. Даже интересоваться способами сделать это лень. Прогу надо писать так, чтобы к ней можно было вернуться через 10 лет на другом компиляторе, не мучаясь вопросом «А чой-та это у меня такое было»?

hobbit ★★★★★
()
Ответ на: комментарий от chuemir

Интуитивно кажется, что линкер что-то такое должен уметь делать.

Не должен.

hobbit ★★★★★
()

Ставишь my_tool.cpp первым, будет браться первый встречный main из my_tool.obj

anonymous
()

Ты можешь попробовать вынести при компиляции все функции в отдельные секции при помощи -ffunction-sections, а потом при помощи objcopy снести секции с ненужными функциями.

Собственно, вот пример нагуглился: https://stackoverflow.com/questions/39873148/remove-unused-section-using-objcopy

Но в твоём случае это точно не здоровое решение.

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

Вот это из серии той черной магии, что мне и интересна! Спасибо.

Вообще, похоже что strip -N main tool.cpp.o вполне себе решает проблему, кстати, хотя это и не совсем то о чем я думал.

chuemir
() автор топика
Ответ на: комментарий от chuemir

Ну да, наверное можно и strip. Просто тем способом я на практике пользовался, а strip ещё нет.

apt_install_lrzsz ★★★
()
Ответ на: комментарий от anonymous

Работает. Собственно вот про muldefs я как раз не знал и не cмог нагуглить. Вот чего-то такого я как раз и ждал в качестве ответа, так что спасибо!

chuemir
() автор топика
Ответ на: комментарий от chuemir

Интуитивно кажется, что линкер что-то такое должен уметь делать.

так я об этом же и говорю — какой то линкер умеет, какой то нет. Это его необязательная способность. В стандартах как си++ так и си ничего об этом не сказано.

safocl ★★
()
Ответ на: комментарий от chuemir

muldefs

ага — вот только это не во всех компиляторах — а значит не будет переносимо. Эта опция не поддержана стандартом. — в связи с чем это как я и говорил выше — обычная привязка к tool

safocl ★★
()
Ответ на: комментарий от safocl

muldefs

Это ld -z muldefs. man 1 ld

Эта опция не поддержана стандартом

Эта опция не может поддерживаться стандартом, так как по стандарту main только один.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.