#c #makefile #linker
Вопрос:
Хорошо, я собираюсь включить некоторую предысторию о том, чего я пытаюсь достичь, не стесняйтесь переходить к концу для примера, который демонстрирует, о чем я говорю.
В данный момент я пытаюсь настроить тестовую платформу вокруг своего кода, чтобы как можно меньше повлиять на фактическую базу кода (сейчас я рассматриваю несколько других платформ и хочу сделать переключение как можно более безболезненным). Подход, который я использую в настоящее время, заключается в том, чтобы связать все объектные файлы моего проекта вместе с моим тестирующим кодом, чтобы мне не пришлось обращаться к #include
исходным файлам или использовать какой-либо другой хак.
Этот подход создает проблему с main
функцией по очевидным причинам; мой текущий план состоит в том, чтобы просто не связывать объектный файл из моего проекта, который определяет main
. Это помешало бы мне протестировать его, но это действительно просто, и любые проблемы будут действительно очевидны, так что меня это устраивает. (Я бы сказал , что этот подход превосходит альтернативу завинчивания таблицы символов main.o
, которая является единственной альтернативой, которую я могу придумать на данный момент.)
Проблема до сих пор заключается в том, что я, похоже, не могу make
отфильтровать main.o
список объектных файлов, которые я связываю вместе, см. Ниже.
Обещанная демонстрация того, о чем я говорю:
MAIN_PROG_OBJ_DIR ::= build/test/release/main-prog-obj
# In the actual Makefile, this is generated as usual
MAIN_PROG_OBJS ::= build/test/release/main-prog-obj/state.o build/test/release/main-prog-obj/main.o build/test/release/main-prog-obj/util.o build/test/release/main-prog-obj/process_args.o
MAIN_O ::= $(MAIN_PROG_OBJ_DIR)"/main.o"
OBJS_FOR_BUILD ::= $(filter-out $(MAIN_O),$(MAIN_PROG_OBJS))
.PHONY: test
test:
@echo should be removed [$(MAIN_O)]
@echo OBJS_FOR_BUILD [$(OBJS_FOR_BUILD)]
в моей системе запуск этого с make -f testmk test
выходом:
should be removed [build/test/release/main-prog-obj/main.o]
OBJS_FOR_BUILD [build/test/release/main-prog-obj/state.o build/test/release/main-prog-obj/main.o build/test/release/main-prog-obj/util.o build/test/release/main-prog-obj/process_args.o]
Очевидно, я неправильно понимаю, что $(filter-out
делает/каков его синтаксис, так как же мне выполнить то, что я пытаюсь сделать?
Спасибо!
Комментарии:
1.
"main.o"
—>main.o
?2.
MAIN_O
имеет значение$(MAIN_PROG_OBJ_DIR)"/main.o"
, которое не совпадаетbuild/test/release/main-prog-obj/main.o
, поскольку первое содержит кавычки (которые оболочка удаляет при разбореecho
команды, но которые остаются при обработкеmake
).3. Ах, да, вот оно что. Спасибо всем, lmao
4. Если кто-либо из вас заботится о репутации из ответа, не стесняйтесь отвечать, и я сделаю так, чтобы это было решено/озвучено. Поскольку вы прокомментировали в течение 5 секунд друг от друга, я просто отмечу то, что будет первым в качестве ответа
Ответ №1:
Это была проблема с цитированием, make
она интерпретировалась "main.o"
буквально и поэтому не отфильтровывалась main.o
из списка. Путаница возникла из-за того, что , когда я отвечал эхом "main.o"
, оболочка проанализировала кавычки и просто перешла main.o
к встроенному эху.
Комментарии:
1. При отладке
make
файлов всегда, всегда используйте$(info sometext $(somevar))
, чтобы быть в безопасности от нежелательного уровня интерпретации.