Как протестировать удобство использования библиотеки C++ в configure.in?

Я предпочитаю эту функциональную функцию sleep:

const sleep = ms =>
    Promise(resolve => setTimeout(resolve, ms))
12
задан artless noise 4 February 2016 в 14:19
поделиться

3 ответа

Может быть более чистый способ добиться этого, но я думаю, ваша проблема в том, что методы C ++ "искажаются", чтобы можно было закодировать дополнительную информацию о методе (аргументы, возвращаемые типы и т. Д.) . Например; метод int A :: foo (void) будет искажен до чего-то вроде __ ZN1A3fooEv .

Итак, вам нужно найти искаженное имя метода в библиотеке. Вы можете сделать это с помощью команды nm в Unix-подобных ОС:

$ nm libifc++.so | grep ITString

Стоит отметить, что точный формат изменения зависит от компилятора; и поэтому, встроив определенный искаженный символ компилятора в ваш configure.in , он может не работать на других платформах - YMMV.

Примечание: вы можете использовать утилиту c ++ filter чтобы вернуть ему имя ' s удобочитаемая форма; поэтому для примера, который я привел ранее:

$ c++filt __ZN1A3fooEv
A::foo()

См. Изменение имен в C ++ в Википедии для получения дополнительной информации.

7
ответ дан 2 December 2019 в 05:41
поделиться

Будьте осторожны при сравнении DateTimes, созданных в C #. Структура DateTime в C # имеет большую точность, чем тип datetime 1 в SQL Server. Поэтому, если вы сгенерируете DateTime на C # (скажем, из DateTime.Now ), сохраните его в базе данных и получите обратно, он, скорее всего, будет другим.

Например, следующий код:

using(SqlConnection conn = new SqlConnection("Data Source=.;Integrated Security=SSPI"))
using(SqlCommand cmd = new SqlCommand("SELECT @d", conn)){
    DateTime now = DateTime.Now;
    cmd.Parameters.Add(new SqlParameter("@d", now));
    conn.Open();
    DateTime then = (DateTime)cmd.ExecuteScalar();
    Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
    Console.WriteLine(then.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
    Console.WriteLine(then - now);

}

возвращает следующий образец результата.

2009.06.20 12:28:23.6115968
2009.06.20 12:28:23.6100000
-00:00:00.0015968

Итак, в этой ситуации вам нужно проверить, находится ли разница в пределах определенного эпсилона:

Math.Abs((now - then).TotalMilliseconds) < 3

Обратите внимание, что это не проблема, если вы сравниваете два datetime, извлеченные из базы данных, или datetime, построенные из компонентов со второй или большей степенью детализации.

См. также: это сообщение в блоге

1 См. примечание о точности, где упоминается " ? Это заставляет компилятор C ++ генерировать стандартизованные имена символов в стиле C, и автоинструменты смогут их найти.

Я столкнулся с этой проблемой, пытаясь обнаружить gtest и gmock (фреймворки для модульного тестирования Google и имитации объектов) с помощью Autotools, и вот что я придумал:

# gtest has a main function in the gtest_main library with C linkage, we can test for that.
AC_CHECK_LIB([gtest_main], [main], [HAVE_GTEST=1] [TEST_LIBS="$TEST_LIBS -lgtest_main"], 
      AC_MSG_WARN([libgtest (Google C++ Unit Testing Framework) is not installed. Will not be able to make check.])) 

# gmock has no functions with C linkage, so this is a roundabout way of testing for it. We create a small test
# program that tries to instantiate one of gmock's objects, and try to link it with -lgmock and see if it works.
if test "$HAVE_GTEST"                                                                 
then                                                                                  
  saved_ldflags="${LDFLAGS}"                                                          
  LDFLAGS="${LDFLAGS} -lgtest -lgmock"                                                
  AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <gmock/gmock.h>], [testing::Cardinality dummy])],
    [TEST_LIBS="$TEST_LIBS -lgmock"] [HAVE_GMOCK=1],                                           
    [AC_MSG_WARN([libgmock (Google C++ Object Mocking Framework) is not installed. Will not be able to make check.])])
  LDFLAGS="${saved_ldflags}"                                                                                          
fi          
17
ответ дан 2 December 2019 в 05:41
поделиться

Если проверяемая библиотека поддерживает pkg-config , это становится очень просто. Вот все, что я добавил в свой configure.in , чтобы проверить и включить gtest и gmock :

dnl ************************************
dnl Check for googletest and googlemock
dnl ************************************

PKG_CHECK_MODULES(gtestmock, libgtest >= 0.4.0, libgmock >= 0.4.0)
AC_SUBST(gtestmock_LIBS)
AC_SUBST(gtestmock_CFLAGS)

И затем в моем Makefile.am где-то:

sometarget_CXXFLAGS = $(gtestmock_CFLAGS) $(AM_CXXFLAGS)
sometarget_LDADD    = $(gtestmock_LIBS)

Довольно тривиально, а?

3
ответ дан 2 December 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: