Я пытаюсь скомпилировать программу C++, которая по исторической причине использует некоторые функции библиотеки C в OS X Mavericks. По какой-то причине Clang не видит strdup
, popen
и некоторые другие функции. Я заглянул внутрь string.h
, и ясно, что он хочет, чтобы его C-стандарт набросился, но я не могу этого сделать, потому что это C++ код. Что я делаю?
Вот что я использую для создания приложения:
#!/bin/sh
PLATFORM=$(uname -s)
SOURCES="..."
if [ "$PLATFORM" = "Linux" ]; then
PATHS="..."
LIBS="..."
elif [ "$PLATFORM" = "FreeBSD" ]; then
PATHS="..."
LIBS="..."
elif [ "$PLATFORM" = "Darwin" ]; then
PATHS="..."
LIBS="..."
else
echo 'Unknown platform!'
fi
g++ -o app $PATHS -O3 -g3 -Wall -D_POSIX_SOURCE $SOURCES -pthread $LIBS
Согласно стандарту Posix, на который я смотрю (Posix 2008), имя символа, которое вы хотите определить, - _POSIX_C_SOURCE
. В стандарте говорится, что Posix 1990 указал макрос _POSIX_SOURCE
, который был заменен _POSIX_C_SOURCE
, поэтому может быть проблемой обновления скрипта сборки. (Я бы продолжил и определил и то и другое, и, вероятно, также _XOPEN_SOURCE
, чтобы быть уверенным. _XOPEN_SOURCE
до 700
, а два других - к 200809L
, эти определения, по-видимому, предполагают Posix 2008).
strdup
ниpopen
являются стандартными функциями. Дляstrdup
могу ли я предложитьstd::string s2 = s1;
?