Добавить флаг компоновщика во время установки conan

Я работаю над проектом, в котором используется несколько внешних библиотек. Эти библиотеки включаются с помощью Conan. Проект в первую очередь написан для Unix, но его также необходимо скомпилировать и запустить в Windows.

Моя текущая проблема заключается в том, что Windows по умолчанию использует fopen() как O_TEXT, а Unix ожидает, что это будет O_BINARY. У меня есть исправление, которое работает для моего собственного кода, просто включите binmode.obj при ссылке, чтобы изменить это значение по умолчанию на O_BINARY.

Проблема в том, что это не влияет на мои сторонние библиотеки. Поиск в Google для этого не дал многого, большинство предложений, похоже, основаны на том, где вы создаете свой собственный пакет и хотите добавить флаги, а не на том, как добавлять флаги при использовании других пакетов.

Что я пробовал до сих пор:

  1. Поместите binmode.obj перед библиотеками, если порядок компоновки имеет значение. Без разницы.
  2. Добавлено --env 'CL=link binmode.obj' к conan install, но этот флаг не стал частью ни флагов компиляции, ни флагов ссылок.

Любые предложения о том, что я мог бы попробовать?

РЕДАКТИРОВАТЬ: я ошибался в том, что CL не действует. Это было вызвано запутанным выводом. Но я заметил, что CL, по-видимому, применяется как для компилятора, так и для компоновщика, что несколько усложняет выбор флагов. Использование префикса /link позволяет работать с компилятором, но не работает с компоновщиком.

РЕДАКТИРОВАТЬ 2: Больше путаницы... Я не понимал, что синтаксис значения CL был: "<compile flags> /link <link flags>". Однако это повлияло на компиляцию, но не на ссылку. Таким образом, эта переменная среды, по-видимому, не может использоваться, чтобы заставить Конана добавить флаг компоновщика для пакетов на основе автоинструментов.


person Mats L    schedule 15.02.2021    source источник


Ответы (1)


Привет, Матс Л, добро пожаловать в наше сообщество! У меня когда-то была похожая проблема, и то, что я в конечном итоге сделал, было довольно хакерским, но довольно простым:

В моем профиле conan, расположенном в ~/.conan/profiles/default, или в любом другом профиле я добавил переменную среды как таковую: CXX=/usr/bin/clang++ -fms-compatibility. Это заставило меня скомпилировать все исходники С++ с этим флагом (которые могут понимать код, специфичный для Windows).

Итак, в вашем случае вы можете запустить which c++, чтобы найти местоположение вашего компилятора и отредактировать переменную среды CXX в профиле conan, который вы используете, ваш окончательный файл, вероятно, будет выглядеть так:

[settings]
os=Macos
os_build=Macos
arch=x86_64
arch_build=x86_64
compiler=clang
compiler.version=11
compiler.libcxx=libc++
build_type=Release
[options]
[build_requires]
[env]
CXX=c++ --required_flag

Некоторые дополнительные примечания: вы также можете установить этот флаг в переменной среды CC. Предпочтительно не изменять профиль по умолчанию, а скопировать его (скажем, в файл с именем default_edited_copy), а затем вызвать другой профиль с помощью conan ... --profile default_edited_copy

person Spyros Mourelatos    schedule 18.02.2021
comment
Я согласен, что это было хакерским... Я не пробовал переменную среды CXX, но я пробовал другие, которые automake должен слушать, такие как LDFLAGS. По-видимому, для Windows все было сделано по-другому, что может быть причиной того, что это не сработало. В конце концов, вместо этого я использовал libjpeg-turbo, который использует CMake. Затем я мог бы использовать переменную среды LDFLAGS для ввода моего флага компоновщика... - person Mats L; 19.02.2021